<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
<script>
    // 柯里化函数会返回一个函数，如果接收的参数没达到原函数参数的数量，会返回一个函数拼接新参数和原参数，如果达到了原函数参数数量就执行
    /**
     * 函数柯里化：将一个多参数函数转换为一系列单参数函数
     * @param {Function} fn 需要柯里化的原始函数
     * @returns {Function} 柯里化后的新函数，可以接受部分或全部参数
     */
    function curry(fn){
        // 返回柯里化包装函数
        return function curried(...args){
            // 检查当前参数数量是否满足原始函数参数长度
            if(args.length >= fn.length){
                // 参数足够时直接调用原始函数
                return fn.apply(this,args)
            } else {
                // 参数不足时返回新函数继续收集参数
                return function(...newArgs){
                    // 递归合并已收集参数和新参数
                    return curried.apply(this,[...args,...newArgs])
                }
            }
        }
    }

    function fn(a,b,c){
        console.log(a + b + c)
    }
    const last = curry(fn)
    last(1)(2)(3)
</script>
</html>